package com.tbit.uqbike.webmanager.controller.operationsanalysis;

import com.tbit.common.entity.view.Result;
import com.tbit.manager.api.UserStatAPI;
import com.tbit.manager.api.dto.UserStatParam;
import com.tbit.manager.api.vo.LineChartData;
import com.tbit.manager.api.vo.PieChartData;
import com.tbit.uqbike.annos.CurrentLimit;


import com.tbit.uqbike.service.business.operationsanalysis.UserOAService;

import org.apache.xmlbeans.impl.xb.xsdschema.Public;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 运营分析-用户分析
 *
 * @author <a href="mailto:chen.wutian@tbit.com.cn">BUGTian</a>
 * @since 2025/2/27
 */
@CurrentLimit
@RestController
@RequestMapping("/operationsAnalysis/user")
public class UserOAController{

    @Autowired
    private UserOAService userOAService;

    /**
     * 概览数据汇总
     *
     * @param param
     * @return
     */
    @GetMapping("/total")
    public Result<Map<String,Long>> total(UserStatParam param){
        Map<String,Long> resMap = new HashMap<>();
        Long totalUserCount = userOAService.totalUserCount(param);
        Long nameAuthUserCount = userOAService.nameAuthUserCount(param);
        Long newUserCount = userOAService.newUserCount(param);
        Long vipUserCount = userOAService.vipUserCount(param);
        resMap.put("totalUserCount",totalUserCount == null ? 0 : totalUserCount);
        resMap.put("nameAuthUserCount",nameAuthUserCount == null ? 0 : nameAuthUserCount);
        resMap.put("newUserCount",newUserCount == null ? 0 : newUserCount);
        resMap.put("vipUserCount",vipUserCount == null ? 0 : vipUserCount);
        return Result.success(resMap);
    }

    /**
     * 用户总数
     * @param param 统计参数
     * @return 用户总数 ， 截至时间右区间
     */
    @GetMapping("/totalUserCount")
    public Result<Long> totalUserCount(UserStatParam param){
        Long totalUserCount = userOAService.totalUserCount(param);
        return Result.success(totalUserCount == null ? 0 : totalUserCount);
    }

    /**
     * 实名用户数
     * @param param 统计参数
     * @return 实名用户数 ， 截至时间右区间
     */
    @GetMapping("/nameAuthUserCount")
    public Result<Long> nameAuthUserCount(UserStatParam param){
        Long nameAuthUserCount = userOAService.nameAuthUserCount(param);
        return Result.success(nameAuthUserCount == null ? 0 : nameAuthUserCount);
    }


    /**
     * 时间区间内的新增用户数
     * @param param 统计参数
     * @return 区间 时间端内的新增用户数
     */
    @GetMapping("/newUserCount")
    public Result<Long> newUserCount(UserStatParam param){
        Long newUserCount = userOAService.newUserCount(param);
        return Result.success(newUserCount == null ? 0 : newUserCount);
    }

    /**
     * 会员用户数
     * @param param 统计参数
     * @return 会员用户数 - 截至时间右区间
     */
    @GetMapping("/vipUserCount")
    public Result<Long> vipUserCount(UserStatParam param){
        Long vipUserCount = userOAService.vipUserCount(param);
        return Result.success(vipUserCount == null ? 0 : vipUserCount);
    }

    /**
     * 新增用户数 - 日增长折线图
     * @param param 统计参数
     * @return 新增用户数 - 日折线图 - 指定区间
     */
    @GetMapping("/newUserLineChart_Day")
    public Result<List<LineChartData>> newUserLineChart_Day(UserStatParam param){

        return Result.success(userOAService.newUserLineChart_Day(param));
    }

    /**
     * 新增会员数 - 日增长折线图
     * @param param 统计参数
     * @return 新增会员数 - 日折线图 - 指定区间
     */
    @GetMapping("/newVipLineChart_Day")
    public Result<List<LineChartData>> newVipLineChart_Day(UserStatParam param){

        return Result.success(userOAService.newVipLineChart_Day(param));
    }

    /**
     * 用户年龄段分布 - 饼状图
     * @param param 统计参数
     * @return 用户年龄段分布 - 饼状图 - 指定区间
     */
    @GetMapping("/ageDistributionPieChart")
    public Result<List<PieChartData>> ageDistributionPieChart(UserStatParam param){
        return Result.success(userOAService.ageDistributionPieChart(param));
    }

    /**
     * 用户性别分布 - 饼状图
     * @param param 统计参数
     * @return 用户性别分布 - 饼状图 - 指定区间
     */
    @GetMapping("/sexDistributionPieChart")
    public Result<List<PieChartData>> sexDistributionPieChart(UserStatParam param){
        return Result.success(userOAService.sexDistributionPieChart(param));
    }

}
